#include "mainscene.h"
#include "config.h"
#include "map.h"
#include "heroplane.h"
#include "bullet.h"
#include "enemyplane.h"
#include "bomb.h"
#include "endgame.h"
#include "wingame.h"
#include <QIcon>
#include <QTimer>
#include <QPainter>
#include <QDialog>
#include <QKeyEvent>
#include <QMouseEvent>
#include <ctime>
#include <QSound>
#include <QString>
#include <iostream>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QPalette>
#include <QBrush>
#include <QLabel>
using namespace std;

Mainscene::Mainscene(QWidget *parent)
    : QWidget(parent)
{

    //初始化场景
    initScene();

    //计分器设置
    setAttribute(Qt::WA_DeleteOnClose,true);
    resize(800,600);
    Score = 0;
    Life = GAME_LIFE;
    setAutoFillBackground(true);
    QPalette pal;
    QPixmap pixmap("://res/background.png");
    pal.setBrush(QPalette::Background, QBrush(pixmap));
    setPalette(pal);

    score = new QLabel(this);
    score->setFont(QFont("Algerian",16));
    score->setStyleSheet("QLabel{background:transparent;color:white;}");

    life = new QLabel(this);
    life->setFont(QFont("Algerian",16));
    life->setStyleSheet("QLabel{background:transparent;color:white;}");

    label = new QLabel(this);
    label->setFont(QFont("Algerian",18));
    label->setStyleSheet("QLabel{background:transparent;color:white;}");

    QVBoxLayout *lay = new QVBoxLayout;
    lay->addWidget(label);
    lay->addWidget(score);
    lay->addWidget(life);
    setLayout(lay);
}

Mainscene::~Mainscene()
{
    setAttribute(Qt::WA_DeleteOnClose,true);
}

void Mainscene::initScene()
{
    //初始化窗口大小
    setFixedSize(GAME_WIDTH,GAME_HEIGHT);

    //设置窗口标题
    setWindowTitle(GAME_TITLE);

    //设置图标资源
    setWindowIcon(QIcon(GAME_ICON));  //加头文件 #include <QIcon>

    //定时器设置
    m_Timer.setInterval(GAME_RATE);

    //初始化间隔记录
    m_recorder = 0;

    //随机数种子
    srand((unsigned int)time(NULL));  //头文件  #include <ctime>

    playGame();
}

void Mainscene::playGame()
{
    //启动定时器
    m_Timer.start();

    //启动背景音乐
        QSound::play(SOUND_BACKGROUND);

    //监听定时器
    connect(&m_Timer,&QTimer::timeout,[=](){
        //敌机出场
        enemyToScene();
        //更新游戏中元素的坐标
        updatePosition();
        //碰撞检测
        collisionDetection();
        //游戏结束
        endScene();
        //游戏胜利
        GameWin();
        //重新绘制图片
        update();
    });
}

void Mainscene::updatePosition()
{
    //更新地图坐标
        m_map.mapPosition();

    //发射子弹
        m_hero.shoot();
        //计算子弹坐标
        for(int i = 0 ;i < BULLET_NUM;i++)
        {
            //如果子弹状态为非空闲，计算发射位置
            if(!m_hero.m_bullets[i].m_Free)
            {
                m_hero.m_bullets[i].updatePosition();
            }
        }
     //敌机坐标计算
        for(int i = 0 ; i< ENEMY_NUM;i++)
        {
            //非空闲敌机 更新坐标
           if(m_enemys[i].m_Free == false)
           {
              m_enemys[i].updatePosition();
           }
        }

        //遍历所有非空闲的敌机
        for(int i = 0 ;i < ENEMY_NUM;i++)
        {
            if(m_enemys[i].m_Free)
            {
                //空闲飞机 跳转下一次循环
                continue;
            }
            if(m_enemys[i].m_Y >= GAME_HEIGHT)
            {
                //生命值减
                Life--;
                m_enemys[i].m_Free=true;
            }
        }

     //计算爆炸播放的图片
        for(int i = 0 ; i < BOMB_NUM;i++)
           {
               if(m_bombs[i].m_Free == false)
               {
                  m_bombs[i].updateInfo();
               }
           }
     //计算分数
     label->setText(QString(GOAL).arg(GAME_GOAL));
     score->setText(QString(SCORE).arg(Score));
     life->setText(QString(LIFE).arg(Life));

     update();
}

void Mainscene::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);

    //绘制地图
    painter.drawPixmap(0,m_map.m_map1_posY , m_map.m_map1);
    painter.drawPixmap(0,m_map.m_map2_posY , m_map.m_map2);

    //绘制英雄
    if(m_hero.m_Free == false)
    {
        painter.drawPixmap(m_hero.m_X,m_hero.m_Y,m_hero.m_Plane);
    }

    //绘制子弹
    if(!m_hero.m_Free)
    {
        for(int i = 0 ;i < BULLET_NUM;i++)
        {
            //如果子弹状态为非空闲，计算发射位置
            if(!m_hero.m_bullets[i].m_Free)
            {
                painter.drawPixmap(m_hero.m_bullets[i].m_X,m_hero.m_bullets[i].m_Y,m_hero.m_bullets[i].m_Bullet);
            }
        }
    }

    //绘制敌机
        for(int i = 0 ; i< ENEMY_NUM;i++)
        {
            if(m_enemys[i].m_Free == false)
             {
                painter.drawPixmap(m_enemys[i].m_X,m_enemys[i].m_Y,m_enemys[i].m_enemy);
             }
        }
    //绘制爆炸图片
        for(int i = 0 ; i < BOMB_NUM;i++)
        {
            if(m_bombs[i].m_Free == false)
            {
               painter.drawPixmap(m_bombs[i].m_X,m_bombs[i].m_Y,m_bombs[i].m_pixArr[m_bombs[i].m_index]);
            }
        }

    update();
}

void Mainscene::mouseMoveEvent(QMouseEvent *event)
{
    int x = event->x() - m_hero.m_Rect.width()*0.5; //鼠标位置 - 飞机矩形的一半
    int y = event->y() - m_hero.m_Rect.height()*0.5;

    //边界检测
    if(x <= 0 )
    {
        x = 0;
    }
    if(x >= GAME_WIDTH - m_hero.m_Rect.width())
    {
        x = GAME_WIDTH - m_hero.m_Rect.width();
    }
    if(y <= 0)
    {
        y = 0;
    }
    if(y >= GAME_HEIGHT - m_hero.m_Rect.height())
    {
        y = GAME_HEIGHT - m_hero.m_Rect.height();
    }
    m_hero.setPosition(x,y);
    update();
}

void Mainscene::enemyToScene()
{
    m_recorder++;
    if(m_recorder < ENEMY_INTERVAL)
    {
        return;
    }

    m_recorder = 0;

    for(int i = 0 ; i< ENEMY_NUM;i++)
    {
        if(m_enemys[i].m_Free)
        {
            //敌机空闲状态改为false
            m_enemys[i].m_Free = false;
            //设置坐标
            m_enemys[i].m_X = rand() % (GAME_WIDTH - m_enemys[i].m_Rect.width());
            m_enemys[i].m_Y = -m_enemys[i].m_Rect.height();
            break;
        }
    }
}

void Mainscene::collisionDetection()
{
    //遍历所有非空闲的敌机
    for(int i = 0 ;i < ENEMY_NUM;i++)
    {
        if(m_enemys[i].m_Free)
        {
            //空闲飞机 跳转下一次循环
            continue;
        }

        //遍历所有 非空闲的子弹
        for(int j = 0 ; j < BULLET_NUM;j++)
        {
            if(m_hero.m_bullets[j].m_Free)
            {
                //空闲子弹 跳转下一次循环
                continue;
            }

            //如果子弹矩形框和敌机矩形框相交，发生碰撞，同时变为空闲状态即可
            if(m_enemys[i].m_Rect.intersects(m_hero.m_bullets[j].m_Rect))
            {
                m_enemys[i].m_Free = true;
                m_hero.m_bullets[j].m_Free = true;
                Score+=10;
                //播放爆炸效果
                for(int k = 0 ; k < BOMB_NUM;k++)
                {
                    if(m_bombs[k].m_Free)
                    {
                        //播放音效
                        QSound::play(SOUND_BOMB);
                        //爆炸状态设置为非空闲
                        m_bombs[k].m_Free = false;
                        //更新坐标
                        m_bombs[k].m_X = m_enemys[i].m_X;
                        m_bombs[k].m_Y = m_enemys[i].m_Y;
                        break;
                    }
                }
            }
        }

        //遍历所有非空闲的敌机
        for(int i = 0 ;i < ENEMY_NUM;i++)
        {
            if(m_enemys[i].m_Free)
            {
                //空闲飞机 跳转下一次循环
                continue;
            }
            //如果英雄矩形框和敌机矩形框相交，发生碰撞，同时变为空闲状态即可
            if(m_enemys[i].m_Rect.intersects(m_hero.m_Rect))
            {
                m_enemys[i].m_Free = true;
                m_hero.m_Free = true;
                //播放爆炸效果
                for(int k = 0 ; k < BOMB_NUM;k++)
                {
                    if(m_bombs[k].m_Free)
                    {
                        //爆炸状态设置为非空闲
                        m_bombs[k].m_Free = false;
                        //更新坐标

                        m_bombs[k].m_X = m_enemys[i].m_X;
                        m_bombs[k].m_Y = m_enemys[i].m_Y;
                        break;
                    }
                }
            }
        }
    }
}

void Mainscene::endScene(){
    if(!m_hero.m_Free == false||Life<1){
        EndGame *e = new EndGame(Score);
        e->show();
        this->close();
    }
}

void Mainscene::GameWin(){
    if(Score==GAME_GOAL){
        WinGame *w=new WinGame(Score);
        w->show();
        this->close();
    }
}

